LuaObjectOrented

InvokeLua.cs

    using UnityEngine;
    using System.Collections;
    using XLua;

    public class InvokeLua : MonoBehaviour
    {
        [CSharpCallLua]
        public interface ICalc
        {
            int Add(int a, int b);
            int Mult { get; set; }
        }

        [CSharpCallLua]
        public delegate ICalc CalcNew(int mult, params string[] args);

        private string script = @"
                    local calc_mt = {
                        __index = {
                            Add = function(self, a, b)
                                return (a + b) * self.Mult
                            end
                        }
                    }

                    Calc = {
                        New = function (mult, ...)
                            print(...)
                            return setmetatable({Mult = mult}, calc_mt)
                        end
                    }
                ";
        // Use this for initialization
        void Start()
        {
            LuaEnv luaenv = new LuaEnv();
            Test(luaenv);//调用了带可变参数的delegate,函数结束都不会释放delegate,即使置空并调用GC
            luaenv.Dispose();
        }

        void Test(LuaEnv luaenv)
        {
            luaenv.DoString(script);
            CalcNew calc_new = luaenv.Global.GetInPath<CalcNew>("Calc.New");
            ICalc calc = calc_new(10, "hi", "john"); //constructor
            Debug.Log("sum(*10) =" + calc.Add(1, 2));
            calc.Mult = 100;
            Debug.Log("sum(*100)=" + calc.Add(1, 2));
        }

        // Update is called once per frame
        void Update()
        {

        }
    }

🔚

results matching ""

    No results matching ""